package sistema;

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * Classe que simula o chat.
 * 
 * @author Adalberto Teixeira
 * @author Andrey Menezes
 * @author Laise Florentino
 * @author Laio Francis
 * 
 */
public class ServicoMensagemInstantanea {

	String nomeDoLog;
	String logDaConversa;
	String ultimaMensagem; 

	int porta;
	ArrayList<String> listaDeParticipantes;

	/**
	 * Faz o nomeDoLog da conversa no modelo username1-username2.log
	 */
	public void fazNomeLog() {
		nomeDoLog = "";
		for (int i = 0; i < listaDeParticipantes.size(); i++)
			nomeDoLog += listaDeParticipantes.get(i) + "-";
		nomeDoLog = nomeDoLog.substring(0, nomeDoLog.length() - 1) + ".log";
	}

	/**
	 * instancia porta = -1 e logDaConversa = ""
	 */
	public ServicoMensagemInstantanea() {
		porta = -1;
		listaDeParticipantes = new ArrayList<String>();
		logDaConversa = "";
	}

	/**
	 * Adiciona participante na lista de conversa(chat).
	 * 
	 * @param contaUserStories
	 *            usando o userName para adicionar participante em 
	 *            ordem lexografica
	 * @return 
	 */
	public void addParticipante(String contaUserStories) {
		for (int i = 0; i < listaDeParticipantes.size(); i++) {
			if (listaDeParticipantes.get(i).compareTo(
					contaUserStories) >= 0) {
				listaDeParticipantes.add(i, (String) contaUserStories);
				return;
			}
		}
		listaDeParticipantes.add((String) contaUserStories);
	}

	/**
	 * Remove participante da lista de conversa(chat).
	 * 
	 * @param participante O participante a ser removido
	 * @return true para remocao com sucesso, false caso contrario
	 */
	public boolean removeParticipante(String participante) {
		try {
			listaDeParticipantes.remove(participante);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	/**
	 * Adiciona mensagem ao chat.
	 * 
	 * @param remetente O remetente(presente no chat) da mensagem
	 * @param texto O conteudo da mensagem
	 *            
	 */
	public void addMensage(String remetente, String texto) {
		ultimaMensagem = remetente + ": " + texto + "\n";
		logDaConversa += remetente + ": " + texto + "\n";
	}

	/**
	 * Retorna a ultima mensagem enviada ao chat.
	 * 
	 * @return ultimaMensagem
	 */
	public String getUltimaMensagem() {
		return ultimaMensagem;
	}

	/**
	 * Retorna String com a conversa do chat
	 * 
	 * @return logDaConversa contendo todas as mensagens enviadas pelos usuarios
	 */
	public String exibirConversa() {
		return this.logDaConversa;
	}

	/**
	 * Salva a conversa por chat(o log).
	 *
	 * @throws IOException 
	 */
	public void salvarConversa() throws IOException {
		FileWriter fw = new FileWriter(this.nomeDoLog, true);
		fw
				.write(this.logDaConversa);
		fw.close();
	}

	/**
	 * Altera porta de trafego de mensagens.
	 * 
	 * @param porta
	 */
	public void setPorta(int porta) {
		this.porta = porta;
	}

	/**
	 * Retorna a porta de trafego de mensagens.
	 * 
	 * @return porta
	 */
	public int getPorta() {
		return this.porta;
	}

	/**
	 * Retorna remetentes das mensagens.
	 * 
	 * @param para O destinatario
	 * @return retorno
	 */
	public String getRemetente(String para) {
		Iterator<String> it = this.listaDeParticipantes.iterator();
		String retorno;
		while(it.hasNext()){
			retorno = (String) it.next();
			if(!retorno.equals(para))
				return retorno;
		}
		return null;
	}
	
	/**
	 * Encerra servico de chat.
	 * 
	 * @throws IOException
	 */
	public void encerrarServico() throws IOException{
		FileWriter fw = new FileWriter(this.nomeDoLog, true);
		fw.write(this.logDaConversa);
		fw.close();
	}
}
